using System;
using br.ufc.pargo.hpe.kinds;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Para acessar as fatias, usa-se a propriedade Slice, herdada *
 * por herança da classe Unit (Connector => Activate => Unit). *
 * Suponha que um componente tenha componentes aninhados "in1",*
 * "in2" e "in3" e que a unidade cujo protocolo será executado *
 * tenha fatias de "in1" e "in2". Para acessar o objeto que    *
 * representa "in1" e "in2", usa-se:                           *
 * 		- Slice["in1"];                                        *
 * 		- Slice["in2"].                                        *
 * Vão retornar os objetos que representam as unidades dos     *
 * componentes aninhados que são fatias da unidade. Usando     *
 * "cast" para a classe própria da unidade, você pode          *
 * acessar as ações e condições da unidade.                    *
 *                                                             *  
 * LIMITAÇÃO:                                                  *
 * O problema dessa abordagem é que os componentes aninhados   *
 * não podem ser conectores. Mas isso poderia ser resolvido    *
 * gerando a classe dinamicamente, usando reflection, a qual   * 
 * faria chamadas ao componente Connector, tornando uniforme   *
 * o uso dos componentes conectores e não-conectores.          *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 

namespace br.ufc.hash.Connector
{
	namespace ports 
	{
		public interface IConfigurationPort
		{
			// operation(s) for sending the configuration
			// operation(s) for fetching the current configuration 
		}
		
		public interface IReconfigurationPort
		{
			// operations for dynamic reconfiguration
		}
		
		public interface IMonitorPort
		{
			// operations for monitoring the component.
		}
	}
	
	public interface IConnector : IActivateKind, 
							      ports.IConfigurationPort, 
								  ports.IReconfigurationPort, 
								  ports.IMonitorPort
	{		
	}
	
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
	 * This is the class for instantiating the objects that represent  *
	 * the units of the Connector components.                          *
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	public class Connector : Activate
	{
		public Connector ()
		{
		}		
		
		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
		 * This method returns the value of a condition of the unit  *
		 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
		public bool get_condition(string condition)
		{
			bool result = false;
			
			return result;
		}
		
        /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
         * This method executes an action of the unit when called, *
         * whose name is given by the parameter 'action'           *
         * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
		public int perform_action(string action)
		{
			int result = 0;
			
			return result;
		}
		
		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * 
		 * This method executes the protocol of the unit, possibly making calls *
		 * to other actions using 'perform_action(action)'                      *
		 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * */
		public int perform_protocol()
		{
			int result = 0;
			
			return result;
		}
		
	}
	
}

